home *** CD-ROM | disk | FTP | other *** search
- // 12345678901234567890123456789012345678901234567890123456789012345678901234567890
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include <dos/dos.h>
- #include <exec/types.h>
- #include <exec/memory.h>
-
- #include <clib/dos_protos.h>
- #include <clib/exec_protos.h>
- #include <clib/alib_protos.h>
-
- #include <HBBS/ANSI_Codes.h>
- #include <HBBS/Defines.h>
- #include <HBBS/types.h>
- #include <HBBS/structures.h>
- #include <HBBS/hbbscommon_protos.h>
- #include <HBBS/hbbscommon_pragmas.h>
- #include <HBBS/Hbbsnode_protos.h>
- #include <HBBS/Hbbsnode_pragmas.h>
-
- #include "maildoor.h"
- #include "mailscan.h"
- #include "mailread.h"
-
- BOOL GoingForwards;
-
- BOOL MAILREAD_CheckOption( int OptNumber )
- {
- BOOL OptExists = FALSE;
-
- switch( OptNumber )
- {
- case MAILREAD_OPT_ClearScreen:
- OptExists = TRUE;
- break;
- }
-
- return( OptExists );
- }
-
- void MAILREAD_UpdateConfMailData( int ConfNum, int FirstMessage, int LastMessage, char *MessageString, int OffSet )
- {
- char buffer[BUFFER_LENGTH], filename[MAX_PATH_LENGTH], filename3[MAX_PATH_LENGTH];
- struct Node *ConfPtr;
- BPTR lock;
- int n;
- BOOL Okay = TRUE, Found = FALSE, Kill = FALSE, Both = FALSE;
- struct CfgFileData *CfgFile;
-
- if( OffSet==MailSys_Kill )
- {
- OffSet = MailSys_OFFSET_FirstMessage;
- Kill = TRUE;
- }
- if( OffSet==MailSys_Both )
- {
- OffSet = MailSys_OFFSET_FirstMessage;
- Both = TRUE;
- }
-
- ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
-
-
-
- sprintf( filename, "%sMail/MAIL.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath );
-
- if( CfgFile=HBBS_LoadConfig( filename ) )
- {
-
- if( OffSet == MailSys_OFFSET_FirstMessage )
- {
- if( !Kill )
- {
- n = FirstMessage;
- Found = FALSE;
- while( (!Found) && (n <= LastMessage+1))
- {
- n++;
- sprintf( filename3, "%sMail/Messages/%d.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, n );
- if( lock = Lock( filename3, SHARED_LOCK ))
- {
- UnLock( lock );
- Found = TRUE;
- }
- }
- }
- else
- {
- n = 0;
- OffSet = MailSys_OFFSET_LastMessage;
- }
- sprintf( buffer, "%d", n );
- Okay = FALSE;
- if( HBBS_RemoveCfgItem( CfgFile, "First" ) )
- if( HBBS_AddCfgItem( CfgFile, "First", buffer ) )
- Okay = TRUE;
- if( Both )
- OffSet = MailSys_OFFSET_LastMessage;
- }
- if( OffSet == MailSys_OFFSET_LastMessage )
- {
- if( !Kill )
- {
- n = LastMessage+2;
- Found = FALSE;
- while( (!Found) && (n >= FirstMessage-1))
- {
- n--;
- sprintf( filename3, "%sMail/Messages/%d.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, n );
- if( lock = Lock( filename3, SHARED_LOCK ))
- {
- UnLock( lock );
- Found = TRUE;
- }
- }
- }
- else
- {
- n=0;
- }
- sprintf( buffer, "%d", n );
- Okay = FALSE;
- if( HBBS_RemoveCfgItem( CfgFile, "Last" ))
- {
- if( HBBS_AddCfgItem( CfgFile, "Last", buffer ) )
- {
- Okay = TRUE;
- }
- }
- }
- HBBS_SaveConfig( CfgFile );
- HBBS_FlushConfig( CfgFile );
- }
-
- if( !Okay )
- {
- DOOR_WriteText( "Error in Message Base!!!!!\r\n" );
- }
- }
-
- void MAILREAD_UpDateMessage( int ConfNum, char *MessageString, int OffSet )
- {
- char *buffer = NULL, buffer2[BUFFER_LENGTH], filename[MAX_PATH_LENGTH];
- struct Node *ConfPtr;
- int n;
- struct CfgFileData *CfgFile;
-
- ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
-
- sprintf( filename, "%sMail/Messages/%s.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageString );
-
- if( CfgFile=HBBS_LoadConfig( filename ))
- {
- HBBS_GetSetting( CfgFile, (void *)&buffer, VTYPE_STRING, "Read", OPT_SINGLE );
- n = atoi( buffer );
- n++;
- sprintf( buffer2, "%d", n );
- if( HBBS_RemoveCfgItem( CfgFile, "Read" ) )
- HBBS_AddCfgItem( CfgFile, "Read", buffer2 );
- HBBS_SaveConfig( CfgFile );
- HBBS_FlushConfig( CfgFile );
- }
- }
-
- BOOL MAILREAD_DisplayHead( char *MessageString, int ConfNum, int LastMessage )
- {
- BOOL Okay = TRUE;
- char outstr[BUFFER_LENGTH];
- struct Node *ConfPtr;
- struct MAIL_Message *MM;
-
- MYDOOR_DisplayTecLisMailHeader();
-
- ConfPtr = GetNode( BBSGlobal->ConfList , ConfNum-1 );
-
- if( MM = MAILSCAN_CreateMailMsgStruct( ConfNum, MessageString ))
- {
- sprintf( outstr, "Conference : %s (%s/%d)\r\n\r\n", ConfPtr->ln_Name, MessageString, LastMessage );
- DOOR_WriteText( outstr );
- sprintf( outstr, "From : "ANSI_FG_CYAN"%s"ANSI_FG_WHITE"\r\n", MM->MM_From );
- DOOR_WriteText( outstr );
- sprintf( outstr, "To : "ANSI_FG_CYAN"%s"ANSI_FG_WHITE"\r\n", MM->MM_For );
- DOOR_WriteText( outstr );
- sprintf( outstr, "Subject : "ANSI_FG_CYAN"%s"ANSI_FG_WHITE"\r\n", MM->MM_Subject );
- DOOR_WriteText( outstr );
- sprintf( outstr, "Times Read : "ANSI_FG_CYAN"%d"ANSI_FG_WHITE"\r\n", MM->MM_Read );
- DOOR_WriteText( outstr );
- sprintf( outstr, "Times DLed : "ANSI_FG_CYAN"%d"ANSI_FG_WHITE"\r\n", MM->MM_DownLoaded );
- DOOR_WriteText( outstr );
-
- MAILREAD_UpDateMessage( ConfNum, MessageString, MailSys_OFFSET_MessageRead );
- }
- else
- {
- Okay = FALSE;
- }
- return( Okay );
- }
-
- BOOL MAILREAD_DeleteMessage( char *MessageString, int FirstMessage, int LastMessage, int ConfNum )
- {
- char filename1[MAX_PATH_LENGTH], filename2[MAX_PATH_LENGTH];
- struct Node *ConfPtr;
- BPTR lock1, lock2;
- int n;
-
- ConfPtr = GetNode( BBSGlobal->ConfList , ConfNum-1 );
-
- sprintf( filename1, "%sMail/Messages/%s.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageString );
- sprintf( filename2, "%sMail/Messages/%s.TXT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageString );
-
- if( lock1 = Lock( filename1, EXCLUSIVE_LOCK ))
- {
- if( lock2 = Lock( filename2, EXCLUSIVE_LOCK ))
- {
- UnLock( lock1 );
- UnLock( lock2 );
-
- if( DeleteFile( filename1 ) )
- {
- if( DeleteFile( filename2 ) )
- {
- n = atoi( MessageString );
- if( (n == FirstMessage) && (n==LastMessage ))
- {
- MAILREAD_UpdateConfMailData( ConfNum, FirstMessage, LastMessage, MessageString, MailSys_Kill );
- }
- else
- {
- if( n == FirstMessage )
- {
- MAILREAD_UpdateConfMailData( ConfNum, FirstMessage, LastMessage, MessageString, MailSys_OFFSET_FirstMessage );
- }
- if( n == LastMessage )
- {
- MAILREAD_UpdateConfMailData( ConfNum, FirstMessage, LastMessage, MessageString, MailSys_OFFSET_LastMessage );
- }
- }
- return( TRUE );
- }
- }
- }
- }
- return( FALSE );
- }
-
- BOOL MAILREAD_DisplayMessage( char *MessageString, int ConfNum )
- {
- BOOL Done = FALSE;
- int error=0, i=0;
- BPTR file;
- char filename[MAX_PATH_LENGTH], buffer[BUFFER_LENGTH], outstr[BUFFER_LENGTH];
- struct Node *ConfPtr;
-
- ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
-
- sprintf( filename, "%sMail/Messages/%s.TXT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageString );
-
- DOOR_WriteText( " /----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----/\r\n\r\n" );
-
- if( file = Open( filename, MODE_OLDFILE ))
- {
- i=0;
- while( (error == 0)&&(!Done) )
- {
- if( FGets( file, buffer, 255 ))
- {
- i++;
- sprintf( outstr, "%03d ", i );
- stripcr( buffer );
- strcat( buffer, "\r\n" );
- DOOR_WriteText( outstr );
- DOOR_WriteText( buffer );
- }
- else
- {
- Done = TRUE;
- error = IoErr();
- }
- }
- Close( file );
-
- if( error != 0 )
- {
- DOOR_WriteText( "Error in file..\r\n" );
- return( FALSE );
- }
- }
- return( TRUE );
- }
-
- void READMAIL_DisplayHelp( void )
- {
- DOOR_WriteText( "\r\n" );
- DOOR_WriteText( "<CR> - Go Forwards or Backwards\r\n" );
- DOOR_WriteText( "A - Display Message Again\r\n" );
- DOOR_WriteText( "D - Delete Message\r\n" );
- DOOR_WriteText( "N, + - Next Message\r\n" );
- DOOR_WriteText( "P, - - Prev Message\r\n" );
- DOOR_WriteText( "T - Download Attached Files\r\n" );
- DOOR_WriteText( "Z - Download Message (as text)\r\n" );
- DOOR_WriteText( "Q - Quit Reading\r\n" );
- DOOR_WriteText( "\r\n\r\n" );
- }
-
-
- char *MAILREAD_GenerateOptionString( char *MessageNumber, int ConfNum )
- {
- char *s;
- struct MAIL_Message *MM;
-
- if( s = AllocVec( BUFFER_LENGTH, MEMF_CLEAR|MEMF_PUBLIC ))
- {
- MM = MAILSCAN_CreateMailMsgStruct( ConfNum, MessageNumber );
-
- sprintf( s, ANSI_FG_GREEN"Options :- "ANSI_FG_YELLOW"( %s%s%s%s%s%s%s%s%sQ ? )"ANSI_FG_WHITE" >", "+ ", "- ", "A ", "D ", GoingForwards ? ANSI_FG_WHITE"N "ANSI_FG_YELLOW : "N ", GoingForwards ? "P " : ANSI_FG_WHITE"P "ANSI_FG_YELLOW, "R ", (MM->MM_NAttachedFiles > 0) ? "T " : "" , "Z " );
- }
-
- return( s );
- }
-
- int MAILREAD_ReadMessage( char *MessageName, int FirstMessage, int LastMessage, int ConfNum )
- {
- int ReturnValue = 0;
- BOOL DoOptionAgain;
- char *optstr;
-
- if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
- else DOOR_WriteText( "\r\n" );
-
- if( MAILREAD_DisplayHead( MessageName, ConfNum, LastMessage ) )
- {
- if( MAILREAD_DisplayMessage( MessageName, ConfNum ) )
- {
- DOOR_WriteText( "\r\n" );
- DoOptionAgain = TRUE;
- while( DoOptionAgain )
- {
- optstr = MAILREAD_GenerateOptionString( MessageName, ConfNum );
- DOOR_WriteText( optstr );
- FreeVec( optstr );
- DOOR_GetLine( TRUE, TRUE, 0 );
- if( N_ND->OnlineStatus==OS_ONLINE )
- {
- if( !(N_ND->CurrentLine[0]))
- {
- DoOptionAgain = FALSE;
- ReturnValue = 7;
- }
- if( (!(stricmp( N_ND->CurrentLine, "+" )) || (!(stricmp( N_ND->CurrentLine, "N" )))))
- {
- DoOptionAgain = FALSE;
- ReturnValue = 1;
- }
- if( (!(stricmp( N_ND->CurrentLine, "-" )) || (!(stricmp( N_ND->CurrentLine, "P" )))))
- {
- DoOptionAgain = FALSE;
- ReturnValue = 2;
- }
- if( !(stricmp( N_ND->CurrentLine, "D" )))
- {
- if( MAILREAD_DeleteMessage( MessageName, FirstMessage, LastMessage, ConfNum ))
- {
- DOOR_WriteText( "Message Deleted\r\n" );
- DoOptionAgain = FALSE;
- }
- else DOOR_WriteText( "Message NOT Deleted\r\n" );
- DOOR_WriteText( ANSI_UP );
- ReturnValue = 3;
- }
- if( !(stricmp( N_ND->CurrentLine, "A" )))
- {
- if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
- else DOOR_WriteText( "\r\n" );
- if( MAILREAD_DisplayHead( MessageName, ConfNum, LastMessage ) )
- {
- if( MAILREAD_DisplayMessage( MessageName, ConfNum ) )
- {
- DOOR_WriteText( "\r\n" );
- }
- else
- {
- DoOptionAgain = FALSE;
- ReturnValue = 7;
- }
- }
- else
- {
- DoOptionAgain = FALSE;
- ReturnValue = 7;
- }
- }
- if( !(stricmp( N_ND->CurrentLine, "T" )))
- {
- DOOR_WriteText( "Transfer Message Selected\r\n" );
- DOOR_WriteText( ANSI_UP );
- ReturnValue = 4;
- }
- if( !(stricmp( N_ND->CurrentLine, "R" )))
- {
- DOOR_WriteText( "Reply To Message Selected\r\n" );
- DOOR_WriteText( ANSI_UP );
- ReturnValue = 5;
- }
- if( !(stricmp( N_ND->CurrentLine, "Q" )))
- {
- DoOptionAgain = FALSE;
- if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
- else DOOR_WriteText( "\r\n" );
- ReturnValue = 6;
- }
- if( !(stricmp( N_ND->CurrentLine, "?" )))
- {
- READMAIL_DisplayHelp();
- ReturnValue = 7;
- }
- }
- DOOR_WriteText( ANSI_UP );
- }
- }
- else
- {
- DOOR_WriteText( "Error with message data (.TXT)\r\n" );
- }
- }
- else
- {
- DOOR_WriteText( "Error with message info (.DAT)\r\n" );
- }
- return( ReturnValue );
- }
-
- void MAILREAD_ReadMessages( struct List *MessageList, int ConfNum )
- {
- struct Node *ptr;
- BOOL GoToNext = TRUE, Forwards = TRUE;
- int PosInList=0, LastMessage, FirstMessage;
-
- GoingForwards = TRUE;
- FirstMessage = MAILSCAN_GetFirstMessage( ConfNum );
- LastMessage = MAILSCAN_GetLastMessage( ConfNum );
-
- for( ptr = MessageList->lh_Head; (((GoToNext)&&((ptr->ln_Succ)&&( N_ND->OnlineStatus==OS_ONLINE ))))||((!Forwards)&&(GoToNext)) ; ptr = ptr->ln_Succ )
- {
- if( Forwards ) PosInList++;
-
- if( ((!Forwards)&&( PosInList >1)) )
- {
- ptr = ptr->ln_Pred;
- ptr = ptr->ln_Pred;
- PosInList--;
- }
- else
- {
- if( !Forwards )
- {
- MYDOOR_DisplayTecLisMailHeader();
- DOOR_WriteText( "\r\nSorry. No more mail.\r\n\r\n" );
- GoToNext = FALSE;
- }
- }
- if( GoToNext )
- {
- switch( MAILREAD_ReadMessage( ptr->ln_Name, FirstMessage, LastMessage, ConfNum ) )
- {
- case 1:
- GoingForwards = TRUE;
- Forwards = TRUE;
- break;
- case 2:
- GoingForwards = FALSE;
- Forwards = FALSE;
- break;
- case 3:
- FirstMessage = MAILSCAN_GetFirstMessage( ConfNum );
- LastMessage = MAILSCAN_GetLastMessage( ConfNum );
- break;
- case 6:
- GoToNext = FALSE;
- break;
-
- }
- }
- }
- if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
- else DOOR_WriteText( "\r\n" );
- }
-
- void MYDOOR_DoReadMail( int argc, char *argv[] )
- {
- int confnum=0, CurrentMessage, LastMessage, FirstMessage;
- char outstr[BUFFER_LENGTH], filename[MAX_PATH_LENGTH], CM_String[MAX_MAIL_NUM];
- struct Node *ConfPtr;
- BOOL AtLeastOne = FALSE, GoToNext = TRUE, Forwards = TRUE;
- BPTR lock;
-
- GoingForwards = TRUE;
- confnum = N_ND->CurrentConf->ConfNum;
- ConfPtr = GetNode( BBSGlobal->ConfList, confnum-1 );
- FirstMessage = MAILSCAN_GetFirstMessage( confnum );
- LastMessage = MAILSCAN_GetLastMessage( confnum );
- CurrentMessage = FirstMessage;
-
- if( LastMessage != 0 )
- {
- while( ( CurrentMessage >= FirstMessage ) && (CurrentMessage <= LastMessage) && (GoToNext) )
- {
- if( (FirstMessage == 0) && (LastMessage == 0) ) GoToNext = FALSE;
- else
- {
- sprintf( CM_String, "%d", CurrentMessage );
- sprintf( filename, "%sMail/Messages/%s.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, CM_String );
-
- if( lock = Lock( filename, SHARED_LOCK ))
- {
- UnLock( lock );
- if( MAILSCAN_IsMessageForCurrentUser( filename ) )
- {
- AtLeastOne = TRUE;
-
- switch( MAILREAD_ReadMessage( CM_String , FirstMessage, LastMessage, confnum ) )
- {
- case 1:
- GoingForwards = TRUE;
- Forwards = TRUE;
- break;
- case 2:
- if( CurrentMessage-1 < 1 )
- {
- if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
- else DOOR_WriteText( "\r\n" );
- MYDOOR_DisplayTecLisMailHeader();
- DOOR_WriteText( "\r\nSorry. No more mail.\r\n\r\n" );
- GoToNext=FALSE;
- }
- else
- {
- GoingForwards = FALSE;
- Forwards = FALSE;
- }
- break;
- case 3:
- FirstMessage = MAILSCAN_GetFirstMessage( confnum );
- LastMessage = MAILSCAN_GetLastMessage( confnum );
- break;
- case 6:
- GoToNext = FALSE;
- DOOR_WriteText( "\r\n" );
- break;
- }
- }
- else
- {
- if( (MessageBaseError != 0)&&(MessageBaseError != MAILERROR_FileDoesNotExist) )
- {
- GoToNext = FALSE;
- DOOR_WriteText( "\r\n" );
- }
- }
- }
- }
- if( Forwards ) CurrentMessage++;
- else CurrentMessage--;
- }
- }
- if( !AtLeastOne )
- {
- MYDOOR_DisplayTecLisMailHeader();
- sprintf( outstr, "\r\nSorry %s. No messages have been sent to you.\r\n\r\n", N_ND->User.CallData.Handle );
- DOOR_WriteText( outstr );
- }
- else DOOR_WriteText( "\r\n" );
-
- }
-
-